package server;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.StringTokenizer;

/**
 *Thead que corre do lado do servidor que recebe mensagens MULTICAST UDP do client e envia o multicast correspondente!
 */

class ThreadServerUDP extends Thread{
	Server serv;

	ThreadServerUDP(Server tcp){
		this.serv = tcp;
		start();
	}

	public void run(){ 
		waitMulticastMsg();
	}

	void waitMulticastMsg(){
	String mensagem;
		try{
			DatagramSocket aSocket = new DatagramSocket(Global.port);
			System.out.println("Servidor UDP Iniciado! Porta :"+Global.port);
			while(true){
				
				byte[] buffer = new byte[1000];
				DatagramPacket request = new DatagramPacket(buffer, buffer.length);
				aSocket.receive(request);
				mensagem=new String(request.getData()).trim();
				//System.out.println("SERVIDOR MENSAGENS MULTICAST");
				//vai fazer o parsing da mensagem UDP pra extrair o username e a mensagem!
				String m = new String(mensagem);
				StringTokenizer st = new StringTokenizer(m, " ");
				String servico =  st.nextToken();
				/////////////////////////////////////
				if (servico.equals("publicidade")){
					System.out.println("UDP[1] Recebeu uma ligacao ");	
					String mensagemMulticast = mensagem.substring(4); 
					System.out.println("	=>recebi mensagem Multicast de Cliente UDP: "+mensagemMulticast);
					//VOU MANDAR A MENSAGEM PARA TODOS OS UTILIZADORES REGISTADOS NO MULTICAST!
					Enumeration enu = this.serv.users.elements();
					System.out.println("** mensagem a mandar"+mensagemMulticast);
					byte[] s = mensagemMulticast.getBytes();
					
					for(int i=0 ; enu.hasMoreElements();i++){
						User us = (User) enu.nextElement();
						String login= us.getLogin(); 
						//se o jogador estiver logado podemos mandar-lhe a mensagem!
						  if(us.getLoged()){ 
							    
						   //if(this.serv.usersHandlers.getTipoLigacaoCliente(login).equals("SOCKET")){  
							InetAddress inet = this.serv.usersHandlers.getSocketUDP(us.getLogin());  
					    	int remotePort = this.serv.usersHandlers.getSocketUdpPort(us.getLogin());
					    	System.out.println("	=> mandei para "+ login +"msg UDP MULTICAST");
					    	//System.out.println("mensagem a mandar: "+s+"inetadress: "+inet + "porta"+ remotePort );
						    DatagramPacket reply = new DatagramPacket(s,s.length, inet, remotePort);
					        aSocket.send(reply);
						   //}  
					  
						  }  
					}	
				}
				if (servico.equals("register")){
					System.out.println("UDP[1] Recebeu uma ligacao ");	
					String username = st.nextToken();
					System.out.println("	=>recebi msg de registo em mensagens MULTICAST do cliente: "+username.toUpperCase());
					System.out.println("	  registei o utilizador UDP: "+ username.toUpperCase()+" com o IP: "+request.getAddress()+" porta: "+request.getPort());
					
					this.serv.usersHandlers.insereIdentClientSoketUDP(username, request.getAddress() , request.getPort());	   
				}
				if(servico.equals("isAlive")){
                    byte[] s;
                    String str = "sim";
                    s= str.getBytes();
                //    System.out.println("Recebi msg isAlive");
                    DatagramPacket reply = new DatagramPacket(s,s.length, request.getAddress(), request.getPort());
					aSocket.send(reply);
                }
			}
		}catch (SocketException e)
		{e.printStackTrace();
		}catch (IOException e)
		{e.printStackTrace();
		}
	}
}

